1. RBJ Cookbookアルゴリズム
1.1 概略
RBJ Cookbook(正式名称:Cookbook formulae for audio EQ biquad filter coefficients)は、Robert Bristow-Johnson氏によって書かれた、
オーディオ信号処理で最も広く使われているデジタルフィルター(双二次フィルター:Biquad Filter)の係数を計算するための計算レシピ集(アルゴリズム)です。
Web Audio APIの標準仕様や、数多くの音楽制作プラグイン(VSTなど)の内部でそのまま採用されています。
Web Audio APIの標準仕様や、数多くの音楽制作プラグイン(VSTなど)の内部でそのまま採用されています。
1.2 アルゴリズムの3つの核
このアルゴリズムを簡単に説明すると、以下の3つのステップで成り立っています。
(1) アナログ回路をベースにする(アナログプロトタイプ)
(1) アナログ回路をベースにする(アナログプロトタイプ)
まずは、昔ながらのアナログオーディオ回路(理想的な電気回路)のフィルター特性を基準(モデル)とします。
(2) デジタル世界へ変換する(双一次変換 / BLT)
アナログの数式をデジタルの数式に変換するために、双一次変換(Bilinear Transform)という数学的な手法を使います。
このとき、デジタル化による周波数の歪み(周波数ワーピング)が発生するため、あらかじめ計算を補正(プレワーピング)しておく処理も組み込まれています。
(3) 5つの係数を導き出すこのとき、デジタル化による周波数の歪み(周波数ワーピング)が発生するため、あらかじめ計算を補正(プレワーピング)しておく処理も組み込まれています。
変換した結果、デジタルフィルターを動かすために必要な5つの係数(b₀, b₁, b₂ と a₁, a₂ ※a₀=1 に正規化)を直接求めるための一発の計算式が導き出されます。
1.3 特徴
(1) 一発で計算できる:
サンプリング周波数(Fs)、遮断・中心周波数(f₀)、クオリティファクタ(Q または帯域幅)、ゲイン(dB)を入れるだけで、
複雑な行列計算などをせずに四則演算と三角関数(sin, cos)だけで一瞬で係数が求まります。
(2) あらゆるフィルターに対応:
同じ仕組み(双二次フィルター)を使いながら、計算式(レシピ)を少し変えるだけで、以下の8種類以上の定番フィルターをすべて作ることができます。
| フィルター種類 | 簡単な役割 |
| ①ローパス (LPF) | 指定した周波数より低い音だけを通す(モコモコした音にする) |
| ②ハイパス (HPF) | 指定した周波数より高い音だけを通す(低音のゴソゴソ音をカット) |
| ③バンドパス (BPF) | 特定の周波数周辺の狭い範囲だけを通す |
| ④ノッチ (Notch) | 特定の周波数ピンポイントだけを完全に消し去る(ハウリング対策など) |
| ⑤ピーキング EQ | 一般的なイコライザ。特定の周波数周辺を山型にブースト/カットする |
| ⑥ローシェルフ / ハイシェルフ | 指定した周波数より低域、または高域を全体的に棚型に上げ下げする |
| ⑦オールパス (APF) | 音量は変えずに、位相(音のタイミング)だけを変化させる |
2. 計算式
2.1 基本変数と中間変数の意味
ユーザーが指定する「基本パラメータ」から、プログラムの内部で「中間変数(ωo,α)」を計算します。
(1)基本パラメータ(ユーザーが指定するもの)
(2)中間変数(計算を簡単にするためのステップ)
(1)基本パラメータ(ユーザーが指定するもの)
a. Fs (Sampling Frequency) :
サンプリング周波数(例: 44100 Hz や 48000 Hz)
b. fo (Center / Cutoff Frequency) :
中心周波数 または 遮断(カットオフ)周波数(Hz)
c. Q (Quality Factor) :
クオリティファクタ。フィルターの「鋭さ」や「帯域幅(Bandwidth)」を表します。
値が大きいほどピンポイントに鋭く効き、小さいほど緩やかに広く効きます。
d.dBgain:
ゲイン(dB)。ピーキングEQやシェルフフィルターで、音量を何dB上げ下げするかを指定します(ローパス等では使いません)。
サンプリング周波数(例: 44100 Hz や 48000 Hz)
b. fo (Center / Cutoff Frequency) :
中心周波数 または 遮断(カットオフ)周波数(Hz)
c. Q (Quality Factor) :
クオリティファクタ。フィルターの「鋭さ」や「帯域幅(Bandwidth)」を表します。
値が大きいほどピンポイントに鋭く効き、小さいほど緩やかに広く効きます。
d.dBgain:
ゲイン(dB)。ピーキングEQやシェルフフィルターで、音量を何dB上げ下げするかを指定します(ローパス等では使いません)。
(2)中間変数(計算を簡単にするためのステップ)
a. ω0 (オメガ・ゼロ)
• 意味:
デジタル世界における角周波数(ラジアン)です。
• 計算式:
ω0=2πfo/Fs
• 補足:
アナログの周波数を、デジタルの円周上の角度(0 〜 π)にマッピングしたものです。
これを使って、プログラム内で sin や cos を計算します。
b. α (アルファ)デジタル世界における角周波数(ラジアン)です。
• 計算式:
ω0=2πfo/Fs
• 補足:
アナログの周波数を、デジタルの円周上の角度(0 〜 π)にマッピングしたものです。
これを使って、プログラム内で sin や cos を計算します。
• 意味:
フィルターの帯域幅(Q値)を実際の計算に組み込むための共通係数です。
• 計算式(Q基準の場合):
α = sin(ω0) / 2Q
• 補足:
RBJ Cookbookでは、Qの代わりに「オクターブ幅(BW)」や「シェルフの傾き(S)」から α を計算するバリエーションも用意されていますが、この Q を使った式が最も一般的です。
c. A (エー)フィルターの帯域幅(Q値)を実際の計算に組み込むための共通係数です。
• 計算式(Q基準の場合):
α = sin(ω0) / 2Q
• 補足:
RBJ Cookbookでは、Qの代わりに「オクターブ幅(BW)」や「シェルフの傾き(S)」から α を計算するバリエーションも用意されていますが、この Q を使った式が最も一般的です。
• 意味:
ゲインの倍率(リニア値)の平方根です。(※ピーキングとシェルフでのみ使用)
• 計算式:
ゲインの倍率(リニア値)の平方根です。(※ピーキングとシェルフでのみ使用)
• 計算式:
2.2 フィルターの計算式
(1)双二次フィルター(Biquad Filter)の基本形は、以下のデジタル信号処理の式です。

RBJ Cookbookのレシピは、この b0, b1, b2, a0, a1, a2 の6つの係数を決めるためのものです。
実際の実装では、あらかじめ全体を a0 で割って、a0 = 1 として処理します
(2)以下に、主要な7種類のフィルターの計算レシピをまとめました。

RBJ Cookbookのレシピは、この b0, b1, b2, a0, a1, a2 の6つの係数を決めるためのものです。
実際の実装では、あらかじめ全体を a0 で割って、a0 = 1 として処理します
共通で使用する値:cos(ω0), sin(ω0),α,A
⑦ ローシェルフ (Low-Shelf) ※少し複雑になります
(3)式の共通点
| フィルター種類 | b0 | b1 | b2 | a0 | a1 | a2 |
|---|---|---|---|---|---|---|
| ① ローパス (LPF) | (1-cosω0)/2 | 1-cosω0 | (1-cosω0)/2 | 1+α | -2cosω0 | 1-α |
| ② ハイパス (HPF) | (1+cosω0)/2 | -(1+cosω0) | (1+cosω0)/2 | 1+α | -2cosω0 | 1-α |
| ③ バンドパス (BPF) (ピークゲイン0dB版) | α | 0 | -α | 1+α | -2cosω0 | 1-α |
| ④ ノッチ (Notch) | 1 | -2cosω0 | 1 | 1+α | -2cosω0 | 1-α |
| ⑤ オールパス (APF) | 1-α | -2cosω0 | 1+α | 1+α | -2cosω0 | 1-α |
| ⑥ ピーキング EQ | 1+ α×A | -2cosω0 | 1- α×A | 1+ α/A | -2cosω0 | 1- α/A |
・β = 2 sqrt(A) × α (※Qから導出する場合の簡略形)
b0=A[(A+1)-(A-1)cosω0+β]
b1=2A[(A-1)-(A+1)cosω0]
b2=A[(A+1)-(A-1)cosω0-β]
a0=(A+1)+(A-1)cosω0+β
a1=-2[(A-1)+(A+1)cosω0]
a2=(A+1)-(A-1)cosω0-β
b1=2A[(A-1)-(A+1)cosω0]
b2=A[(A+1)-(A-1)cosω0-β]
a0=(A+1)+(A-1)cosω0+β
a1=-2[(A-1)+(A+1)cosω0]
a2=(A+1)-(A-1)cosω0-β
このアルゴリズムの素晴らしいところは、分母の係数(特に a1 と a2 に注目すると分かります。
• LPF、HPF、BPF、Notch、APF は、すべて分母 a0,a1,a2 の形が全く同じ 1+α, -2cosω0, 1-α です。
• 分子の b 系列を入れ替えるだけで、ローパスになったりハイパスになったりします。
この共通性があるため、プログラムを作る際は「基本のBiquadフィルター構造」を1つ用意しておき、スイッチを切り替えるように分子・分母の係数を代入するだけで、あらゆるイコライザーやフィルターを実装することができます。
• LPF、HPF、BPF、Notch、APF は、すべて分母 a0,a1,a2 の形が全く同じ 1+α, -2cosω0, 1-α です。
• 分子の b 系列を入れ替えるだけで、ローパスになったりハイパスになったりします。
この共通性があるため、プログラムを作る際は「基本のBiquadフィルター構造」を1つ用意しておき、スイッチを切り替えるように分子・分母の係数を代入するだけで、あらゆるイコライザーやフィルターを実装することができます。
3. 回路(ブロック図)
3.1概要
RBJ Cookbookの各フィルター(ローパスやピーキングEQなど)は、物理的な「抵抗やコンデンサを組み合わせたアナログ回路」ではなく、「共通の1つのデジタル構造(ブロック図)」のなかの「係数の値(数字)」だけを書き換えて実現します。
そのため、ローパス専用の回路図、ハイパス専用の回路図が個別に存在するわけではなく、すべてのフィルターで全く同じ以下の「信号流路図(ブロック図)」を共有します。
デジタル信号処理(DSP)では、この構造を「Direct Form I(直接型I)」または「Direct Form II(直接型II)」と呼びます。
ブロック図の説明

デジタルフィルター(Biquad 4大構造)の比較表
表を読み解くポイント
• メモリの節約:
そのため、ローパス専用の回路図、ハイパス専用の回路図が個別に存在するわけではなく、すべてのフィルターで全く同じ以下の「信号流路図(ブロック図)」を共有します。
デジタル信号処理(DSP)では、この構造を「Direct Form I(直接型I)」または「Direct Form II(直接型II)」と呼びます。
ブロック図の説明

デジタルフィルター(Biquad 4大構造)の比較表
| 構造(フォーム) | 必要最小限の遅延器 | 演算ノイズ | 特徴と主な用途 |
|---|---|---|---|
| Direct Form I | 4個 | 普通 | ・数式から直感的に実装可能 |
| Direct Form I 転置型 | 4個 | 少ない | ・通常のI型よりノイズが減少 |
| Direct Form II | 2個 | 普通 | ・メモリ消費を削減 |
| Direct Form II 転置型 | 2個 | 極めて少ない | ・省メモリと低ノイズを両立 |
Direct Form II 系列では遅延器の数を半減できます。
• 実用上のベストプラクティス:
多くのシステムで採用されているのは 「Direct Form II 転置型」 です。
3.2 Direct Form I
3.2.1 概要
Direct Form I(直接型I)は、デジタルフィルターの基本式を最も素直にそのまま表した構造です。
ブロック図:

特徴:
ブロック図:

特徴:
中央の加算器を境に、左側に入力信号 x[n] の過去ログ用遅延器 (Z^-1) が2つ、右側に出力信号 y[n] の過去ログ用遅延器 (Z^-1) が2つ、計4つの遅延器が完全に独立して配置されています。
3.2.2 1つで7つ
なぜ1つの図で「7種類のフィルター」に化けるのか?
アナログ回路であれば、ローパスフィルターを作るには「抵抗とコンデンサ」を繋ぎ、ハイパスにするにはその配置を物理的に組み替える必要があります。
しかし、RBJ Cookbookのレシピで計算した5つの係数 (b0, b1, b2, a1, a2) の数値を書き換えるだけで、フィルターの性質が全く別物に変化します。
• ローパス (LPF) にしたいとき:
アナログ回路であれば、ローパスフィルターを作るには「抵抗とコンデンサ」を繋ぎ、ハイパスにするにはその配置を物理的に組み替える必要があります。
しかし、RBJ Cookbookのレシピで計算した5つの係数 (b0, b1, b2, a1, a2) の数値を書き換えるだけで、フィルターの性質が全く別物に変化します。
• ローパス (LPF) にしたいとき:
高音をカットする数値を設定します。過去の入力と出力の波が互いに打ち消し合い、滑らかな低音だけが残るように係数が調整されます。
• ノッチ(特定の音を消す)にしたいとき:
特定の周波数を消し去る数値を設定します。狙った周波数の波だけがちょうど逆位相(プラスマイナス逆)になって足し合わされ、完全に消滅します。
3.2.3 実装はどうなるか
1枚目の図の通り、左右の遅延器にそれぞれ過去のデータを蓄えて計算するプログラムです。
// 過去の記憶(遅延器 Z⁻¹)の変数(初期値はすべて 0.0)
double x1 = 0.0, x2 = 0.0; // 入力の過去ログ(図の左側)
double y1 = 0.0, y2 = 0.0; // 出力の過去ログ(図の右側)
// 毎サンプルごとの処理関数
double processDF1(double x, double b0, double b1, double b2, double a1, double a2) {
// 図の通りに掛け算と足し算を行う(a0=1に正規化済み)
double y = b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2;
// 遅延器(Z⁻¹)の記憶を更新して次に備える
x2 = x1; x1 = x; // 左側のシフト
y2 = y1; y1 = y; // 右側のシフト
return y;
}
double x1 = 0.0, x2 = 0.0; // 入力の過去ログ(図の左側)
double y1 = 0.0, y2 = 0.0; // 出力の過去ログ(図の右側)
// 毎サンプルごとの処理関数
double processDF1(double x, double b0, double b1, double b2, double a1, double a2) {
// 図の通りに掛け算と足し算を行う(a0=1に正規化済み)
double y = b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2;
// 遅延器(Z⁻¹)の記憶を更新して次に備える
x2 = x1; x1 = x; // 左側のシフト
y2 = y1; y1 = y; // 右側のシフト
return y;
}
3.2.4 強みと注意点
強み:
入力と出力の過去ログが完全に独立しているため、数式からの置き換えが直感的です。
数値的な限界(オーバーフロー)が起きにくく、初心者にも非常に扱いやすい安定した構造です。
注意点:
左右で別々に過去ログを記憶するため、遅延器(メモリ変数)が合計4つ必要になり、メモリの消費量が後述の Direct Form II より多くなります。
3.3 Direct Form I 転置型
3.3.1 概要
Direct Form I 転置型(直接型I 転置構成)は、Direct Form I の「入力の過去」と「出力の過去」を独立して処理する特性をそのままに、掛け算と遅延の順序を反転(転置)させた構造です。
ブロック図:

特徴:
ブロック図:

特徴:
遅延器 (Z^-1) が左側に2つ、右側に2つ、計4つに分かれている点は通常の Direct Form I と同じです。
しかし、中央の共通ラインから信号が四方に分岐して、先に係数 (b0, b1, b2, -a1, -a2) と掛け算され、その後に遅延器と加算器 を通りながら「下から上へ」と足し上げられていくのが大きな違いです。
しかし、中央の共通ラインから信号が四方に分岐して、先に係数 (b0, b1, b2, -a1, -a2) と掛け算され、その後に遅延器と加算器 を通りながら「下から上へ」と足し上げられていくのが大きな違いです。
3.3.2 1つで7つ
なぜ1つの図で「7種類のフィルター」に化けるのか?
他の構造と同じく、図の流路(配線)は一切変えず、流し込む5つの係数の数値を書き換えるだけで変化します。
• ローパス (LPF) にしたいとき:
他の構造と同じく、図の流路(配線)は一切変えず、流し込む5つの係数の数値を書き換えるだけで変化します。
• ローパス (LPF) にしたいとき:
入力・出力された信号がそれぞれのルートで一斉に掛け算され、下から上へ遅延しながら合流していく段階で、高音の波だけが綺麗に打ち消し合うように係数が作用します。
• ノッチ(特定の音を消す)にしたいとき:
狙った特定の周波数の成分だけが、上へ昇りながら加算器で合流した瞬間に、ちょうどプラスマイナスゼロ(逆位相)になって完全に消滅するような数値を流し込みます。
3.3.3 実装はどうなるか
左側のフィードバック用の遅延器(内部状態)を dl1, dl2、右側のフィードフォワード用の遅延器を dr1, dr2 と置き、図を下から上へ読み解くように計算するプログラムです。
// 4つの遅延器(図の左側2つ、右側2つの Z⁻¹ 内部状態。初期値はすべて 0.0)
double dl1 = 0.0, dl2 = 0.0; // 左側の遅延器(上、下)
double dr1 = 0.0, dr2 = 0.0; // 右側の遅延器(上、下)
// 毎サンプルごとの処理関数
double processDF1T(double x, double b0, double b1, double b2, double a1, double a2) {
// 1. 図の左上:入力 x と、左側ルートから上がってきた dl1 が合流して中央のラインが決まる
double center = x + dl1;
// 2. 図の右上:中央ラインに b0 を掛けたものと、右側ルートから上がってきた dr1 が合流して出力 y になる
double y = b0 * center + dr1;
// 3. 次のサンプルのために、左側(フィードバック側)の遅延器を更新
// ※掛ける相手は出力「y」です
dl1 = -a1 * y + dl2; // 左側中央の加算器
dl2 = -a2 * y; // 左側一番下の遅延器へ
// 4. 次のサンプルのために、右側(フィードフォワード側)の遅延器を更新
// ※掛ける相手は入力「x」です
dr1 = b1 * x + dr2; // 右側中央の加算器
dr2 = b2 * x; // 右側一番下の遅延器へ
return y;
}
double dl1 = 0.0, dl2 = 0.0; // 左側の遅延器(上、下)
double dr1 = 0.0, dr2 = 0.0; // 右側の遅延器(上、下)
// 毎サンプルごとの処理関数
double processDF1T(double x, double b0, double b1, double b2, double a1, double a2) {
// 1. 図の左上:入力 x と、左側ルートから上がってきた dl1 が合流して中央のラインが決まる
double center = x + dl1;
// 2. 図の右上:中央ラインに b0 を掛けたものと、右側ルートから上がってきた dr1 が合流して出力 y になる
double y = b0 * center + dr1;
// 3. 次のサンプルのために、左側(フィードバック側)の遅延器を更新
// ※掛ける相手は出力「y」です
dl1 = -a1 * y + dl2; // 左側中央の加算器
dl2 = -a2 * y; // 左側一番下の遅延器へ
// 4. 次のサンプルのために、右側(フィードフォワード側)の遅延器を更新
// ※掛ける相手は入力「x」です
dr1 = b1 * x + dr2; // 右側中央の加算器
dr2 = b2 * x; // 右側一番下の遅延器へ
return y;
}
3.3.4 強みと注意点
• 強み(省メモリ):
先にすべての掛け算を行ってから遅延・加算する特性上、3.3で解説した通常の Direct Form I よりも浮動小数点の計算で発生するノイズ(丸め誤差)が少なくなります。
また、Direct Form I 由来の「オーバーフロー(数値のパンク)への強さ」も維持しています。
• 注意点(数値のバースト):
また、Direct Form I 由来の「オーバーフロー(数値のパンク)への強さ」も維持しています。
3.5の「Direct Form II 転置型」がメモリを2つに節約でき、なおかつノイズも少なくて優秀であるため、実用上のオーディオプラグインなどではあえてメモリを4つ使うこの「Direct Form I 転置型」が選ばれるケースはやや稀です。
しかし、理論的な美しさと演算の並列化のしやすさから、DSPの設計書や教科書には必ず登場する重要な構造です。
しかし、理論的な美しさと演算の並列化のしやすさから、DSPの設計書や教科書には必ず登場する重要な構造です。
3.4 Direct Form II
3.4.1 概要
Direct Form II(直接型II)は、Direct Form I の無駄を省き、メモリの効率を極限まで高めた構造です。
ブロック図:

特徴:
ブロック図:

特徴:
入出力の順序を数学的に入れ替えることで、中央の縦1列にある2つの遅延器 (Z^-1) を、入力と出力の両方で「共通のメモリ」としてシェアしています。
3.4.2 1つで7つ
なぜ1つの図で「7種類のフィルター」に化けるのか?
Direct Form I と同様に、図の構造(流路)はそのままで、係数(b, a 系列の数値) を切り替えるだけで変化します。 • ローパス (LPF) にしたいとき:
Direct Form I と同様に、図の構造(流路)はそのままで、係数(b, a 系列の数値) を切り替えるだけで変化します。 • ローパス (LPF) にしたいとき:
左側のフィードバックで「低音が強調されやすい中央ライン(中間状態)」を作り、それを右側の (b0, b1, b2) で整えて低音だけを出力します。
• ノッチ(特定の音を消す)にしたいとき:
特定の周波数のときに、中央ラインから右側へ進む合流ポイントで波が綺麗に相殺されるような係数セットを流し込みます。
3.4.3 実装はどうなるか
ブロック図の通り、中央の縦一列(中間状態の過去ログ)を基準に計算するプログラムです。
// 共通の遅延器(図の中央にある Z⁻¹ 2つ。初期値は 0.0)
double w1 = 0.0; // 上側の Z⁻¹
double w2 = 0.0; // 下側の Z⁻¹
// 毎サンプルごとの処理関数
double processDF2(double x, double b0, double b1, double b2, double a1, double a2) {
// 1. 図の左側:中央最上段のポイント(中間状態 w)を計算
double w = x - a1 * w1 - a2 * w2;
// 2. 図の右側:右端の最終出力 y を計算
double y = b0 * w + b1 * w1 + b2 * w2;
// 3. 中央の遅延器を上から下へシフトして更新
w2 = w1;
w1 = w;
return y;
}
double w1 = 0.0; // 上側の Z⁻¹
double w2 = 0.0; // 下側の Z⁻¹
// 毎サンプルごとの処理関数
double processDF2(double x, double b0, double b1, double b2, double a1, double a2) {
// 1. 図の左側:中央最上段のポイント(中間状態 w)を計算
double w = x - a1 * w1 - a2 * w2;
// 2. 図の右側:右端の最終出力 y を計算
double y = b0 * w + b1 * w1 + b2 * w2;
// 3. 中央の遅延器を上から下へシフトして更新
w2 = w1;
w1 = w;
return y;
}
3.4.4 強みと注意点
• 強み(省メモリ):
必要な遅延器(メモリ)が2つだけで済むため、Direct Form I に比べてメモリ消費量を50%カットできます。
大量のフィルターを同時に動かすハードウェアやプラグインで非常に有利です。
• 注意点(数値のバースト):
大量のフィルターを同時に動かすハードウェアやプラグインで非常に有利です。
計算の途中で、中央の変数(w)の値が一時的に非常に大きくなる性質があります。
現代のパソコン(浮動小数点)なら問題ありませんが、古い機器などの整数計算環境では音が歪んだりバースト(オーバーフロー)しやすいため注意が必要です。
現代のパソコン(浮動小数点)なら問題ありませんが、古い機器などの整数計算環境では音が歪んだりバースト(オーバーフロー)しやすいため注意が必要です。
3.5 Direct Form II 転置型
3.5.1 概要
Direct Form II 転置型(直接型II 転置構成)は、Direct Form II の「メモリが少なくて済む」というメリットを維持したまま、さらに構造をひっくり返すことで欠点を克服した、実用上最も完成度の高い構造です
ブロック図:

特徴:
ブロック図:

特徴:
Direct Form II と同様に、遅延器 (Z^-1) は中央の2つだけです。
3.5.2 1つで7つ
なぜ1つの図で「7種類のフィルター」に化けるのか?
他の構造と同じく、図の流路(配線)は固定したまま、係数の数値だけを入れ替えることで機能が化けます。 • ローパス (LPF) にしたいとき:
他の構造と同じく、図の流路(配線)は固定したまま、係数の数値だけを入れ替えることで機能が化けます。 • ローパス (LPF) にしたいとき:
入力された音に一斉に (b0, b1, b2) が掛けられ、同時に出力された音からも (-a1, -a2) が掛けられます。
これらが中央の遅延器を通って合流する際、高域の成分だけが打ち消し合うような数値セットになります。
• ノッチ(特定の音を消す)にしたいとき:
狙った特定の周波数の成分だけが、中央の加算器で合流したときにちょうどプラスマイナスゼロ(逆位相)になって綺麗に相殺されるような数値を流し込みます。
3.5.3 実装はどうなるか
中央の縦に並んだ遅延器(内部状態)の場所を、上から順に d1、d2 という2つの変数として保持し、図を下から上へ読み解くように計算するプログラムです。
// 2つの遅延器(中央にある Z⁻¹ の内部状態。初期値は 0.0)
double d1 = 0.0; // 上側の Z⁻¹
double d2 = 0.0; // 下側の Z⁻¹
// 毎サンプルごとの処理関数
double processDF2T(double x, double b0, double b1, double b2, double a1, double a2) {
// 1. 最上段の合流ポイントで、現在の出力 y が決まる
double y = b0 * x + d1;
// 2. 次のサンプルのために、上側の遅延器 (d1) を更新
//(中央の加算器の場所:左からの b1*x、右からの -a1*y、下からの d2 が合流)
d1 = b1 * x - a1 * y + d2;
// 3. 一番下の遅延器 (d2) を更新
//(最下段の加算器の場所:左からの b2*x、右からの -a2*y が合流)
d2 = b2 * x - a2 * y;
return y;
}
double d1 = 0.0; // 上側の Z⁻¹
double d2 = 0.0; // 下側の Z⁻¹
// 毎サンプルごとの処理関数
double processDF2T(double x, double b0, double b1, double b2, double a1, double a2) {
// 1. 最上段の合流ポイントで、現在の出力 y が決まる
double y = b0 * x + d1;
// 2. 次のサンプルのために、上側の遅延器 (d1) を更新
//(中央の加算器の場所:左からの b1*x、右からの -a1*y、下からの d2 が合流)
d1 = b1 * x - a1 * y + d2;
// 3. 一番下の遅延器 (d2) を更新
//(最下段の加算器の場所:左からの b2*x、右からの -a2*y が合流)
d2 = b2 * x - a2 * y;
return y;
}
3.5.4 強みと注意点
• 強み(省メモリ):
通常の Direct Form II の弱点だった「途中の数値が大きくなりすぎる(オーバーフロー)」という問題が構造上発生しません。
また、浮動小数点の計算で発生する微小なノイズ(丸め誤差)も非常に少なく、「省メモリ」「高音質」「数値的な安定性」のすべてを兼ね備えています。
そのため、MATLABの標準フィルターや、各種オーディオプラグイン(DSP)の内部実装では、この「転置型」が業界の標準(デファクトスタンダード)として最も広く使われています。
• 注意点(数値のバースト):
また、浮動小数点の計算で発生する微小なノイズ(丸め誤差)も非常に少なく、「省メモリ」「高音質」「数値的な安定性」のすべてを兼ね備えています。
そのため、MATLABの標準フィルターや、各種オーディオプラグイン(DSP)の内部実装では、この「転置型」が業界の標準(デファクトスタンダード)として最も広く使われています。
信号が四方八方に分岐して同時に掛け算されるため、ブロック図をパッと見たときの直感的な信号の流れ(数式との一致度)が、
Direct Form I ほど分かりやすくないという点だけが唯一のデメリットです(プログラムの性能面でのデメリットはありません)。
